home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / mint / utils / stelm3.lzh / STELM / NEWMAIL.C < prev    next >
C/C++ Source or Header  |  1993-11-12  |  3KB  |  109 lines

  1. /*
  2.    Newmail version 2                    Jeroen Berger November 1993
  3.    
  4.    Checks mailbox of user and informs him/her of receiving new mail.
  5.    Looks for environment-variable "mail" for specification for
  6.    newmail check-interval (in seconds).
  7.  
  8.    Puts itself in the background after starting up.
  9.    Automatically exits itself when the user proces that invoked 
  10.    newmail does exit.
  11.  
  12.    Any questions or suggestions about this program can be send to:
  13.    
  14.    berger@tudebg.et.tudelft.nl or
  15.    lemmens@dv.twi.tudelft.nl
  16. */
  17.  
  18. #include <stdio.h>
  19. #include <stdlib.h>
  20. #include <string.h>
  21. #include <unistd.h>
  22.  
  23. #include <stat.h>
  24. #include <signal.h>
  25.  
  26. #define        FALSE        0
  27. #define        TRUE        1
  28.  
  29. void DaemonMode(void)
  30. {        
  31.     switch ((int)fork())
  32.     {    case -1:
  33.             fputs("can't fork newmail !\n",stderr);
  34.             exit(1);
  35.             break;
  36.         case 0:
  37.             (void)setpgid(0,0);
  38.             (void)kill(getppid(),SIGKILL);
  39.             break;
  40.         default:
  41.             /* parent waits to be killed */
  42.             exit(0);
  43.             break;
  44.     }
  45. }
  46.  
  47. void main( void )
  48. {
  49.     /* MailPath must be \\ instead of / or else standard
  50.      I/O functions can't handle this path ! (KL)
  51.     */
  52.     
  53.     char            achMailFile[40], achMailPath[]={ "u:\\usr\\mail\\" };
  54.     char            achNewMailMessage[]={"\7\r\nYou have new mail.\7"};
  55.     char            achErrorMessage[]={"\7\r\nCan't handle your mail-file (anymore).\7"};
  56.     char            chStartUp=TRUE;
  57.     struct stat     FileStat;
  58.     unsigned        usSleep=60;
  59.     FILE            *pFp;
  60.     size_t            LastSize=0;
  61.     int                ppid=getppid();    /* pid of starting shell */
  62.     
  63.     signal(SIGTTOU,SIG_IGN);
  64.     
  65.     if( getenv( "mail" )!=NULL )
  66.     {    /* changed sscanf into atoi, to make .ttp smaller (KL) */
  67.         usSleep = atoi(getenv( "mail" ) );
  68.     }
  69.     
  70.     if( getenv( "LOGNAME" )==NULL )
  71.     {
  72.         fputs( "\nNo logname specified!\n", stderr );
  73.         exit( 1 );
  74.     }
  75.     
  76.     DaemonMode();    /* added this (KL) */
  77.     
  78.     /* changed sprint into str functions to make .ttp smaller (KL) */
  79.     strcpy(achMailFile, achMailPath);
  80.     strcat(achMailFile, getenv( "LOGNAME" ) );
  81.     
  82.     do
  83.     {
  84.         if( stat( achMailFile, &FileStat )!=0 )
  85.         {
  86.             if((pFp=fopen( achMailFile, "w" )) != NULL)
  87.                 fclose( pFp );
  88.  
  89.             /* I moved this part here, to save system load (KL) */            
  90.             if( stat( achMailFile, &FileStat )!=0 )
  91.             {
  92.                 fputs( achErrorMessage, stderr );
  93.                 exit( 0 );
  94.             }
  95.         }
  96.  
  97.         /* added ==FALSE or else it won't work if you alter
  98.            the values for FALSE and TRUE !! (KL)
  99.         */
  100.         if( ( FileStat.st_size>LastSize ) && chStartUp==FALSE )
  101.             puts( achNewMailMessage );
  102.         
  103.         chStartUp=FALSE;
  104.         LastSize=FileStat.st_size;
  105.         
  106.         sleep( usSleep );
  107.     }
  108.     while( kill(ppid,SIGNULL) == 0);    /* as long as starting shel runs */
  109. }